;------------------------------------------------------ ; TEST DELLA RAM ; ; Per monitor multi-firmware ; Allocato a F000h nella eprom ;------------------------------------------------------ .include "jump.inc" ; Indirizzi working area stack .equ 000efh ; indirizzo inziale dello stack pointer rampda .equ 000f0h ; ram presente - E' quella che viene controllata affinché non cambi rampa .equ 000f2h ramtda .equ 000f4h ; ram da testare ramta .equ 000f6h cursv .equ 000f8h ; posizione del cursore (non del carattere) sul video vecchio cursn .equ 000fah ; posizione del cursore sul video nuovo cursd .equ 000fch ; posizione del cursore sui display curfon .equ 000fdh ; flag cursori accesi. Se =00h i cursori sono accesi, se =20h i cursori sono spenti tiptes .equ 000feh ; tipo di test richiesto. 01h=base, 02h=avanzato .org 0F000h inizio: ld hl,45EDh ; disabilita i tasti BREAK ld (0066h),hl ld hl,0000h ; controlla se la ram da 0000h a 00FFh è OK lopram: xor a ; controlla la cella per 00h ld (hl),a ld a,(hl) or a ; cp 00h jp nz,errram ; se c'è un errore esce cpl ; controlla la cella per 0ffh ld (hl),a ld a,(hl) cp 0ffh jp nz,errram ; se c'è un errore esce and 01010101b ; controlla la cella per 01010101b ld (hl),a ld a,(hl) cp 01010101b jp nz,errram ; se c'è un errore esce cpl ; controlla la cella per 10101010b ld (hl),a ld a,(hl) cp 10101010b jp nz,errram ; se c'è un errore esce inc hl ; salta alla cella successiva ld a,h ; esce a 0100h cp 01h jr nz,lopram ;------------------------------------------------------ ld hl,stack ; imposta lo stack pointer ld sp,hl call lf0a5 ; inizializza i registri del SY6545 ed i PIO della scheda video nuova call checv ; imposta il registro B' che indica se esiste la scheda video vecchia ld a,01h ; imposta il registro D', che indica che l'input da tastiera deve controllare anche il BACKSPACE exx ld d,a exx ld a,0C3h ; abilita i tasti BREAK ld (0066h),a ld hl,break ld (0067h),hl call inivid ; inizializza la schermata video ld hl,msg1 ; visualizza "TEST RAM" call vis ld hl,help ; visualizza l'help call vis ld hl,menu ; visualizza il menù call vis ld hl,tabds1 ; visualizza il menù sui display call vdisp linp1: call curon ; accende il cursore call input ; input di un carattere call curoff ; spegne il cursore ld (tiptes),a ; salva il tipo di test richiesto cp 03h ; se è stato digitato 3 -> fine programma jr nz,linp1x jp 0f800h linp1x: cp 01h ; controlla che sia stato digitato solo 1 o 2 jr z,linp1a cp 02h jr z,linp1a jr linp1 ;------------------------------------------------------ linp1a: call inivid ; inizializza la schermata video ld a,(tiptes) cp 02h jr z,linp1b ld hl,msg15 ; visualizza "TEST RAM SEMPLICE" jr linp1c linp1b: ld hl,msg16 ; visualizza "TEST RAM AVANZATO" linp1c: call vis ld hl,msg2 ; visualizza "RAM DA TESTARE: " call vis linp2: ld hl,tabds2 ; visualizza sui display call vdisp ld hl,msg3 ; visualizza "INDIRIZZO INIZIALE: " call indir ; input dell'indirizzo e controllo che non sia < 0100h jr nz,linp2 ld (ramtda),hl ; salva l'indirizzo iniziale linp3: ld hl,tabds3 ; visualizza sui display call vdisp ld hl,msg4 ; visualizza "INDIRIZZO FINALE: " call indir ; input dell'indirizzo e controllo che non sia < 0100h jr nz,linp3 ld (ramta),hl ; salva l'indirizzo finale or a ; azzera il carry ld bc,(ramtda) ; se l'indirizzo finale è <= di iniziale richiede gli indirizzi sbc hl,bc jr c,linp4 jr z,linp4 jr linp5 ; altrimenti prosegue linp4: ld hl,msg14 ; visualizza messaggio di errore call vis ld hl,msg3 ; cancella le righe di input alla posizione di msg3 e msg4 call delinp ld hl,msg4 call delinp jr linp2 ;------------------------------------------------------ linp5: ld a,(tiptes) ; verifica il tipo di test richiesto cp 01h jr z,linp9 ; se 01h evita il test avanzato ld hl,msg5 ; visualizza "RAM CHE NON SI DEVE MODIFICARE: " call vis linp6: ld hl,tabds4 ; visualizza sui display call vdisp ld hl,msg6 ; visualizza "INDIRIZZO INIZIALE: " call indir ; input dell'indirizzo e controllo che non sia < 0100h jr nz,linp6 ld (rampda),hl ; salva l'indirizzo iniziale linp7: ld hl,tabds5 ; visualizza sui display call vdisp ld hl,msg7 ; visualizza "INDIRIZZO FINALE: " call indir ; input dell'indirizzo e controllo che non sia < 0100h jr nz,linp7 ld (rampa),hl ; salva l'indirizzo finale or a ; azzera il carry ld bc,(rampda) ; se l'indirizzo finale è <= di iniziale richiede gli indirizzi sbc hl,bc jr c,linp8 jr z,linp8 jr linp9 ; altrimenti prosegue linp8: ld hl,msg14 ; visualizza messaggio di errore call vis ld hl,msg6 ; cancella le righe di input alla posizione di msg6 e msg7 call delinp ld hl,msg7 call delinp jr linp6 ;------------------------------------------------------ linp9: ld hl,tabds6 ; visualizza sui display call vdisp ld hl,msg8 ; visualizza "ATTENDERE..." call vis ld a,(tiptes) ; se il test è semplice non serve azzerare la ram cp 01h ; perchè non bisogna verificare se si modifica da sola jr z,linp10 or a ; azzera il carry ld hl,(rampa) ; azzera tutta la ram presente ld bc,(rampda) sbc hl,bc push hl pop bc ld hl,(rampda) ld de,(rampda) inc de xor a ld (hl),a ldir linp10: ld hl,(ramtda) ; carica l'indirizzo iniziale da testare ;------------------------------------------------------ loop: push hl ; posiziona il cursore per visualizzare l'indirizzo in fase di test ld hl,adr1 call poscur pop hl ld a,0f3h ; posiziona il cursore per i display ld (cursd),a call visadr ; visualizza l'indirizzo in fase di test xor a ; controlla la cella per 00h ld (hl),a ld a,(hl) or a ; cp 00h jr nz,err cpl ; controlla la cella per 0ffh ld (hl),a ld a,(hl) cp 0ffh jr nz,err and 01010101b ; controlla la cella per 01010101b ld (hl),a ld a,(hl) cp 01010101b jp nz,err ; se c'è un errore esce cpl ; controlla la cella per 10101010b ld (hl),a ld a,(hl) cp 10101010b jp nz,err ; se c'è un errore esce xor a ; azzera la locazione scritta ld (hl),a ld a,(tiptes) ; se il test è avanzato controlla che la ram non si sia modificata cp 02h call z,chkram inc hl ; salta alla cella successiva ld a,h ; controlla se HL=0000h. Se sì significa che ha passato 0fffh, quindi esce or l jr z,fine loop1: ld de,(ramta) ; controlla se ha finito. Esce all'indirizzo "ramta"+1 or a ; azzera il carry push hl sbc hl,de ; imposta il carry se hl= 0ah addiziona 037h, altrimenti 030h add a,030h jr disp2 disp1: add a,037h disp2: push hl ld hl,(cursv) ; legge l'indirizzo attuale del cursore call waitv ; attende la ritraccia del video vecchio ld (hl),a ; visualizza il carattere sul video vecchio inc hl ld (cursv),hl ; salva il nuovo indirizzo del cursore del video vecchio disp2a: push af ld a,(curfon) ; se il cursore sul video vecchio era acceso lo visualizza or a jr nz,disp3 ld a,81h ; accende (scrive) il cursore sul video vecchio ld (hl),a disp3: ld hl,(cursn) ; posiziona il carattere da visualizzare sul video nuovo call lf06e pop af call writen ; attende la ritraccia e visualizza il carattere sul video nuovo ld hl,(cursn) ; salva la nuova posizione del cursore del video nuovo inc hl ld (cursn),hl call lf060 ; posiziona il cursore sul video nuovo ld a,(curfon) ; accende o spegne il cursore sul video nuovo call cursor disp4: pop hl pop af ret ;------------------------------------------------------ ; Visualizza l'indirizzo a video ; DE deve contenere la posizione del video vecchio. Il video nuovo deve essere già posizionato ; HL contiene l'indirizzo da visualizzare ; visadr: ld a,h ; separa i nibbles di HL che indicano l'indirizzo srl a srl a srl a srl a and 0fh call dispch ; visualizza il 1° byte dell'indirizzo call posdis ; posiziona in C il display da utilizzare e incrementa la posizione del cursore dei display call vdispc ; visualizza sui display ld a,h and 0fh call dispch ; visualizza il 2° byte dell'indirizzo call posdis ; posiziona in C il display da utilizzare e incrementa la posizione del cursore dei display call vdispc ; visualizza sui display ld a,l srl a srl a srl a srl a and 0fh call dispch ; visualizza il 3° byte dell'indirizzo call posdis ; posiziona in C il display da utilizzare e incrementa la posizione del cursore dei display call vdispc ; visualizza sui display ld a,l and 0fh call dispch ; visualizza il 4° byte dell'indirizzo call posdis ; posiziona in C il display da utilizzare e incrementa la posizione del cursore dei display call vdispc ; visualizza sui display ret ;------------------------------------------------------ ; Accende il cursore ; curon: push af push hl ld a,0ah ; seleziona il registro R10 out (8ch),a xor a ; scrive il valore 00h per accendere il cursore out (8dh),a ld a,81h ; accende il cursore sul video vecchio ld hl,(cursv) ; legge la posizione del cursore del video vecchio call waitv ld (hl),a xor a ; indica che i cursori sono accesi ld (curfon),a pop hl pop af ret ;------------------------------------------------------ ; Spegne il cursore ; Sul video nuovo viene sempre spento, anche se lo era già ; curoff: push af push hl ld a,(curfon) ; se i cursori erano già spenti non fa nulla cp 020h jr z,curof1 ld a,0ah ; seleziona il registro R10 out (8ch),a ld a,020h ; scrive il valore 32 (20h) per spegnere il cursore out (8dh),a ld hl,(cursv) ; spegne il cursore sul video vecchio call waitv ld (hl),a ld (curfon),a ; indica che i cursori sono spenti curof1: pop hl pop af ret ;------------------------------------------------------ ; Routine per la gestione dei tasti BREAK break: ld hl,inizio ; salta all'inizio del programma ritornando dall'interrupt non mascherabile push hl retn ;------------------------------------------------------ ; Azzeramento riga messaggi clrmsg: push af push bc push de push hl ld hl,(cursn) ; salva le posizioni dei cursori nello stack push hl ld hl,(cursv) push hl ld hl,msg0 call vis pop hl ; recupera le posizioni dei cursori ld (cursv),hl pop hl ld (cursn),hl call lf060 ; riposiziona il cursore sul video nuovo pop hl pop de pop bc pop af ret ;------------------------------------------------------ ; Controlla se l'indirizzo presente in HL è < 0100h ; Ritorna il carry se < 0100h chkind: push hl push bc ld bc,0100h or a ; azzera il carry sbc hl,bc ; se HL